package com.msb.juc.thread.basic;

import java.util.concurrent.*;

/**
 * 本质上，只有一种方法，即：new Thread()对象，然后调用start()方法，只不过，有5种形式<p>
 * 1. 继承Thread类，重写run() 方法<p>
 * 2. 实现Runnable接口，实现run() 方法<p>
 * 3. 实现Callable接口,实现call() 方法<p>
 * 4. 使用Lambda表达式<p>
 * 5. 使用ThreadPool线程池
 * @author HuanyuLee
 * @date 2022/3/12
 */
public class T02_CreateThread {
    static class MyThread extends Thread{
        @Override
        public void run() {
            System.out.println("Hello MyThread!");
        }
    }

    static class MyRun implements Runnable{

        @Override
        public void run() {
            System.out.println("Hello MyRun!");
        }
    }

    static class MyCall implements Callable<String>{

        @Override
        public String call() throws Exception {
            System.out.println("Hello MyCall!");
            return "success";
        }
    }



    public static void main(String[] args) throws Exception {
        // 第1种
        new MyThread().start();
        // 第2种 阿里代码规约：不要显式创建线程，请使用线程池。
        new Thread(new MyRun()).start();
        // 第3种 阿里代码规约：不要显式创建线程，请使用线程池。
        new Thread(()-> System.out.println("Hello Lambda!")).start();
        // 第4种 阿里代码规约：不要显式创建线程，请使用线程池。
        FutureTask<String> ft = new FutureTask<>(new MyCall());
        Thread t = new Thread(ft);
        t.start();
        System.out.println(ft.get());

        // 第5种
        final ExecutorService service = Executors.newCachedThreadPool();
        service.execute(()->{
            System.out.println("Hello ThreadPool!");
        });
        System.out.println("-----------------------------------");
        // 使用线程池
        service.submit(new MyRun());
        Future<String> future = service.submit(new MyCall());
        // 阻塞方法
        final String s = future.get();
        System.out.println("s = " + s);

        service.shutdown();
    }
}